{{#models}}{{#model}}/*
 * {{classname}}.h
 *
 * {{description}}
 */

#ifndef _{{classname}}_H_
#define _{{classname}}_H_

#include <string.h>
#include "../external/cJSON.h"
#include "../include/list.h"
#include "../include/keyValuePair.h"
{{#imports}}
#include "{{{.}}}.h"
{{/imports}}

{{#isEnum}}

{{#allowableValues}}
typedef enum  { {{#enumVars}} {{{value}}}{{#first}} = 0{{/first}}{{^-last}},{{/-last}}{{/enumVars}} } {{classname}}_e;
{{/allowableValues}}

char* {{classname}}_ToString({{classname}}_e {{classname}});

{{classname}}_e {{classname}}_FromString(char* {{classname}});

cJSON *{{classname}}_convertToJSON({{classname}}_e {{classname}});

{{classname}}_e {{classname}}_parseFromJSON(cJSON *{{classname}}JSON);

{{/isEnum}}
{{^isEnum}}
{{#vars}}
{{^isContainer}}
    {{^isModel}}
    {{#isEnum}}
        {{#allowableValues}}
                typedef enum  { {{#enumVars}} {{{value}}}{{#first}} = 0{{/first}}{{^-last}},{{/-last}}{{/enumVars}} } {{name}}_e;
        {{/allowableValues}}

        char* {{name}}_ToString({{name}}_e {{name}});

        {{name}}_e {{name}}_FromString(char* {{name}});
    {{/isEnum}}
    {{/isModel}}
    {{/isContainer}}
    {{#isContainer}}
    {{#items}}
        {{^isModel}}
        {{#isEnum}}
            {{#allowableValues}}
                    typedef enum  { {{#enumVars}} {{{value}}}{{^-last}},{{/-last}}{{/enumVars}} } {{name}}_e;
            {{/allowableValues}}

            char* {{name}}_ToString({{name}}_e {{name}});

            {{name}}_e {{name}}_FromString(char* {{name}});
        {{/isEnum}}
        {{/isModel}}
        {{/items}}
    {{/isContainer}}
{{/vars}}


typedef struct {{classname}}_t {
    {{#vars}}
    {{^isContainer}}
    {{^isPrimitiveType}}
    {{#isModel}}
    {{#isEnum}}
    {{datatype}}_e {{name}}; //enum model
    {{/isEnum}}
    {{^isEnum}}
    struct {{datatype}}_t *{{name}}; //model
    {{/isEnum}}
    {{/isModel}}
    {{#isUuid}}
    {{datatype}} *{{name}}; // uuid
    {{/isUuid}}
    {{#isEmail}}
    {{datatype}} *{{name}}; // email
    {{/isEmail}}
    {{#isFreeFormObject}}
    {{datatype}}_t *{{name}}; //object
    {{/isFreeFormObject}}
    {{/isPrimitiveType}}
    {{#isPrimitiveType}}
    {{#isNumeric}}
    {{datatype}} {{name}}; //numeric
    {{/isNumeric}}
    {{#isBoolean}}
    {{datatype}} {{name}}; //boolean
    {{/isBoolean}}
    {{#isEnum}}
    {{#isString}}
    {{name}}_e {{name}}; //enum
    {{/isString}}
    {{/isEnum}}
    {{^isEnum}}
    {{#isString}}
    {{datatype}} *{{name}}; // string
    {{/isString}}
    {{/isEnum}}
    {{#isByteArray}}
    {{datatype}} {{name}}; //Byte
    {{/isByteArray}}
    {{#isBinary}}
    {{datatype}} {{name}}; //binary
    {{/isBinary}}
    {{#isDate}}
    {{datatype}} *{{name}}; //date
    {{/isDate}}
    {{#isDateTime}}
    {{datatype}} *{{name}}; //date time
    {{/isDateTime}}
    {{/isPrimitiveType}}
    {{/isContainer}}
    {{#isContainer}}
    {{#isListContainer}}
    {{#isPrimitiveType}}
    {{datatype}}_t *{{name}}; //primitive container
    {{/isPrimitiveType}}
    {{^isPrimitiveType}}
    {{datatype}}_t *{{name}}; //nonprimitive container
    {{/isPrimitiveType}}
    {{/isListContainer}}
    {{#isMapContainer}}
    {{datatype}} {{name}}; //map
    {{/isMapContainer}}
    {{/isContainer}}
    {{/vars}}

} {{classname}}_t;

{{classname}}_t *{{classname}}_create(
    {{#vars}}
    {{^isContainer}}
    {{^isPrimitiveType}}
    {{#isModel}}
    {{#isEnum}}
    {{datatype}}_e {{name}}{{#hasMore}},{{/hasMore}}
    {{/isEnum}}
    {{^isEnum}}
    {{datatype}}_t *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isEnum}}
    {{/isModel}}
    {{#isUuid}}
    {{datatype}} *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isUuid}}
    {{#isEmail}}
    {{datatype}} *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isEmail}}
    {{#isFreeFormObject}}
    {{datatype}}_t *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isFreeFormObject}}
    {{/isPrimitiveType}}
    {{#isPrimitiveType}}
    {{#isNumeric}}
    {{datatype}} {{name}}{{#hasMore}},{{/hasMore}}
    {{/isNumeric}}
    {{#isBoolean}}
    {{datatype}} {{name}}{{#hasMore}},{{/hasMore}}
    {{/isBoolean}}
    {{#isEnum}}
    {{#isString}}
    {{name}}_e {{name}}{{#hasMore}},{{/hasMore}}
    {{/isString}}
    {{/isEnum}}
    {{^isEnum}}
    {{#isString}}
    {{datatype}} *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isString}}
    {{/isEnum}}
    {{#isByteArray}}
    {{datatype}} {{name}}{{#hasMore}},{{/hasMore}}
    {{/isByteArray}}
    {{#isBinary}}
    {{datatype}} {{name}}{{#hasMore}},{{/hasMore}}
    {{/isBinary}}
    {{#isDate}}
    {{datatype}} *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isDate}}
    {{#isDateTime}}
    {{datatype}} *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isDateTime}}
    {{/isPrimitiveType}}
    {{/isContainer}}
    {{#isContainer}}
    {{#isListContainer}}
    {{#isPrimitiveType}}
    {{datatype}}_t *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isPrimitiveType}}
    {{^isPrimitiveType}}
    {{datatype}}_t *{{name}}{{#hasMore}},{{/hasMore}}
    {{/isPrimitiveType}}
    {{/isListContainer}}
    {{#isMapContainer}}
    {{datatype}} {{name}}{{#hasMore}},{{/hasMore}}
    {{/isMapContainer}}
    {{/isContainer}}
    {{/vars}}
);

void {{classname}}_free({{classname}}_t *{{classname}});

{{classname}}_t *{{classname}}_parseFromJSON(cJSON *{{classname}}JSON);

cJSON *{{classname}}_convertToJSON({{classname}}_t *{{classname}});

{{/isEnum}}
#endif /* _{{classname}}_H_ */
{{/model}}{{/models}}
